﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class Insumo
    {
        //public string getCorrelativo( dbGestionDataContext _db,string familia, int nivel)
        //{
        //    string ultimo;
        //    // el correlativo actual de la familia
        //    // funciona  para crear familia y subfamilia
        //    string codigostr = "";

        //    if (nivel == 3)
        //    {
        //        ultimo = (from a in _db.Insumo
        //                  where a.codigo.Substring(0, 6) == familia && a.nivel == nivel
        //                  select a.codigo.Substring(7, 4)).Max();

        //        if (ultimo == null)
        //            ultimo = "0";

        //        int codigoint = int.Parse(ultimo);
        //        codigoint++;
        //         codigostr = codigoint.ToString();

        //        if (codigoint.ToString().Length == 1)
        //        {
        //            // colocamos los ceros
        //            codigostr = "000" + codigoint.ToString();
        //        }
        //        if (codigoint.ToString().Length == 2)
        //        {
        //            // colocamos los ceros
        //            codigostr = "00" + codigoint.ToString();
        //        }
        //        if (codigoint.ToString().Length == 3)
        //        {
        //            // colocamos los ceros
        //            codigostr = "0" + codigoint.ToString();
        //        }
        //        if (codigoint.ToString().Length > 4)
        //        {
        //            throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
        //        }
        //    }
        //    if (nivel == 2)
        //    {
        //        ultimo = (from a in _db.Insumo
        //                  where a.codigo.Substring(0, 4) == familia && a.nivel == nivel
        //                  select a.codigo.Substring(4, 2)).Max();

        //        if (ultimo == null)
        //            ultimo = "0";

        //        int codigoint = int.Parse(ultimo);
        //        codigoint++;
        //         codigostr = codigoint.ToString();

        //        if (codigoint.ToString().Length == 1)
        //        {
        //            // colocamos los ceros
        //            codigostr = "0" + codigoint.ToString();
        //        }
        //        if (codigoint.ToString().Length > 2)
        //        {
        //            throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
        //        }
                
        //    }
        //    if (nivel == 1)
        //    {
        //        ultimo = (from a in _db.Insumo
        //                  where a.codigo.Substring(0, 2) == familia && a.nivel == nivel
        //                  select a.codigo.Substring(2, 2)).Max();

        //        if (ultimo == null)
        //            ultimo = "0";

        //        int codigoint = int.Parse(ultimo);
        //        codigoint++;
        //        codigostr = codigoint.ToString();

        //        if (codigoint.ToString().Length == 1)
        //        {
        //            // colocamos los ceros
        //            codigostr = "0" + codigoint.ToString();
                    
        //        }
        //        if (codigoint.ToString().Length > 2)
        //        {
        //            throw new Exception("Termino de secuencia de correlativo ultimo ="+ultimo);
        //        }

        //    }

        //    if (nivel == 0)
        //    {
        //        ultimo = (from a in _db.Insumo
        //                  where a.nivel == nivel
        //                  select   a.codigo.Substring(0, 2)).Max();



        //        if (ultimo == null)
        //            ultimo = "0";

        //        int codigoint = int.Parse(ultimo);
        //        codigoint++;
        //        codigostr = codigoint.ToString();

        //        if (codigoint.ToString().Length == 1)
        //        {
        //            // colocamos los ceros
        //            codigostr = "0" + codigoint.ToString();
        //            familia = "";
        //        }

        //        if (codigoint.ToString().Length > 2)
        //        {
        //            throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
        //        }
        //    }

        //    return familia + codigostr;


        //}

        public int getidAnterior(dbGestionDataContext _db, int idinternal)
        {
            int intAnterior = 0;
            Insumo insumo= _db.Insumos.Single(p => p.idInternal==idinternal);
            //int clase = int.Parse(insumo.codigo.Substring(0,2));

            var id = from i in _db.Insumos
                     where Convert.ToInt64(i.codigo) < Convert.ToInt64(insumo.codigo)
                     & i.idTipoInsumo == insumo.idTipoInsumo
                     select i;
                     

            if (id.Count() > 0)
            {
                Int64 cod = id.Max(p => Convert.ToInt64(p.codigo));
                intAnterior = _db.Insumos.Single(p => Convert.ToInt64(p.codigo) == cod).idInternal;
            }
            else
            {
                throw new Exception("No existe Registros");
            }


            return intAnterior;

        }


        public int getidSiguiente(dbGestionDataContext _db, int idinternal)
        {
            
            int intSiguiente = 0;
            Insumo insumo = _db.Insumos.Single(p => p.idInternal == idinternal);
          

            
            //revisar la sentencia generada
            var id = from i in _db.Insumos
                     where Convert.ToInt64(i.codigo) > Convert.ToInt64(insumo.codigo)
                     & i.idTipoInsumo == insumo.idTipoInsumo
                     select i;


            if (id.Count() > 0)
            {
                Int64  cod = id.Min(p => Convert.ToInt64(p.codigo));
                intSiguiente = _db.Insumos.Single(p => Convert.ToInt64(p.codigo) == cod).idInternal;
            }
            else
            {
                throw new Exception("No existe Registros");
            }

            return intSiguiente;
        }

       
        public string getCorrelativo(dbGestionDataContext _db, string familia, int nivel)
        {
            string ultimo;
            // el correlativo actual de la familia
            // funciona  para crear familia y subfamilia
            string codigostr = "";

            if (familia == String.Empty && nivel>0)
            {
                throw new Exception("Ingrese codigo");
            }

            if (nivel == 3)
            {
                var q= from a in _db.Insumos
                          where a.codigo.Substring(0, 6) == familia && a.nivel == nivel
                          select a.codigo.Substring(6, 4);

                ultimo = q.Max();

                if (ultimo == null | ultimo == "")
                    ultimo = "0";

                int codigoint = int.Parse(ultimo);
                codigoint++;
                codigostr = codigoint.ToString();

                if (codigoint.ToString().Length == 1)
                {
                    // colocamos los ceros
                    codigostr = "000" + codigoint.ToString();
                }
                if (codigoint.ToString().Length == 2)
                {
                    // colocamos los ceros
                    codigostr = "00" + codigoint.ToString();
                }
                if (codigoint.ToString().Length == 3)
                {
                    // colocamos los ceros
                    codigostr = "0" + codigoint.ToString();
                }
                if (codigoint.ToString().Length > 4)
                {
                    throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
                }
            }
            if (nivel == 2)
            {
                familia = familia.Substring(0, 4) ;

                ultimo = (from a in _db.Insumos
                          where a.codigo.Substring(0, 4) == 
                          familia &
                          a.nivel == nivel
                          select a.codigo.Substring(4, 2)).Max();

                if (ultimo == null | ultimo=="")
                    ultimo = "00";

                int codigoint = int.Parse(ultimo);
                codigoint++;
                codigostr = codigoint.ToString();

                if (codigoint.ToString().Length == 1)
                {
                    // colocamos los ceros
                    codigostr = "0" + codigoint.ToString();
                }
                
                
                if (codigoint.ToString().Length > 2)
                {
                    throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
                }

            }
            if (nivel == 1)
            {
                ultimo = (from a in _db.Insumos
                          where a.codigo.Substring(0, 2) == familia && a.nivel == nivel
                          && a.codigo.Substring(2, 2)!="99"
                          select a.codigo.Substring(2, 2)).Max();

                if (ultimo == null)
                    ultimo = "0";

                int codigoint = int.Parse(ultimo);
                codigoint++;
                codigostr = codigoint.ToString();

                if (codigoint.ToString().Length == 1)
                {
                    // colocamos los ceros
                    codigostr = "0" + codigoint.ToString();

                }
                if (codigoint.ToString().Length > 2)
                {
                    throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
                }

            }

            if (nivel == 0)
            {
                //para el padron segun los insumos



                ultimo = (from a in _db.Insumos
                          where a.nivel == nivel && a.codigo.Substring(0, 2).Trim() != "99"
                          
                          select a.codigo.Substring(0, 2)).Max();



                if (ultimo == null)
                {
                    //switch (tipoInsumo)
                    //{
                    //    case 1:
                    //        ultimo = "0";
                    //        break;
                    //    case 2:
                    //        ultimo = "49";
                    //        break;
                    //    case 3:
                    //        ultimo = "74";
                    //        break;
                        
                    //}
                }
                    

                int codigoint = int.Parse(ultimo);
                codigoint++;


                //switch (tipoInsumo)
                //{
                //    case 1:
                //        if (codigoint>50)
                //        throw new Exception("Termino de secuencia de correlativo ultimo=" + ultimo);
                //        break;
                //    case 2:
                //        if (codigoint >= 75)
                //            throw new Exception("Termino de secuencia de correlativo ultimo=" + ultimo);
                     
                //        break;
                //    case 3:
                //        if (codigoint >= 99)
                //            throw new Exception("Termino de secuencia de correlativo ultimo=" + ultimo);
                      
                //        break;
                //    default:
                //        break;
                //}



                codigostr = codigoint.ToString();

                if (codigoint.ToString().Length == 1)
                {
                    // colocamos los ceros
                    codigostr = "0" + codigoint.ToString();
                    familia = "";
                }

                if (codigoint.ToString().Length > 2)
                {
                    throw new Exception("Termino de secuencia de correlativo ultimo=" + ultimo);
                }

                


            }

            return familia +  codigostr;


        }

        public int Add(dbGestionDataContext _db,
            string codigo,
            string descripcion,
            int? idUnidad,
            short nivel,
            int? idPadre,
            bool? bitControlStock,
            int idEmpleado,
            string codigoS10,
            string cuenta,
            bool? bitRec
           )
        {
            this.SetOnInsert(_db,
                         codigo,
                         descripcion,
                         idUnidad,
                         nivel,
                         idPadre,
                         bitControlStock,
                         idEmpleado,
                         codigoS10, 
                         cuenta, bitRec
                        );
            _db.SubmitChanges();

            return this.idInternal;
        }


        public int Update(dbGestionDataContext _db,
           string codigo,
           string descripcion,
           int? idUnidad,
           short nivel,
           int? idPadre,
           bool? bitControlStock,
           int idEmpleado,
            string cuenta,
            bool? bitRec
           )
        {
            
            
            
            this.codigo=codigo;
            this.descripcion=descripcion;
            this.idunidad = idUnidad;
            this.nivel = nivel;
            this.idPadre = idPadre;
            this.bitControlStock = bitControlStock;
            this.bitRec = bitRec;
            this.usuarioMod = idEmpleado;
            this.fechaMod = DateTime.Now;
            this.cuenta = cuenta;
            
            _db.SubmitChanges();

            return this.idInternal;
        }






        public void SetOnInsert(dbGestionDataContext _db,
            string codigo,
            string descripcion,
            int? idUnidad,
            short nivel,
            int? idPadre,
            bool? bitControlStock,
            int idEmpleado,
            string codigoS10,
            string cuenta,
            bool? bitRec)
        {
            this.usuarioCre = idEmpleado;
            this.usuarioMod = idEmpleado;
            this.fechaCreacion = DateTime.Now;
            this.fechaMod = DateTime.Now;
            this.nivel = nivel;
            this.codigo = codigo;
            this.descripcion = descripcion;
            this.idPadre = idPadre;
            this.idunidad = idUnidad;
            this.bitControlStock = bitControlStock;
            this.bitRec = false;
            this.codS10 = codigoS10;
            this.cuenta = cuenta;
            this.bitRec = bitRec;
          
            _db.Insumos.InsertOnSubmit(this);
        }



       

        public int  GetidPadreFromCodigoNivel2(dbGestionDataContext _db,
                                            string codigo)
        {
            return 0;
            ////codigo.Spli
            //bool result = false;
            //var q = from a in _db.Insumo
            //        where a.codigo.Trim() == codigo.Trim()
            //        select a;
            //if (q.Count() > 0)
            //{
            //    result = true;
            //}

            //string ultimo;
            //// el correlativo actual de la familia
            //// funciona  para crear familia y subfamilia
            //string codigostr = "";

            //if (familia == String.Empty && nivel > 0)
            //{
            //    throw new Exception("Ingrese codigo");
            //}

            
            //if (nivel == 2)
            //{
            //    familia = familia.Substring(0, 4) + "99";

            //    ultimo = (from a in _db.Insumo
            //              where a.codigo.Substring(0, 6) == familia && a.nivel == nivel
            //              select a.codigo.Substring(7, 4)).Max();

            //    if (ultimo == null | ultimo == "")
            //        ultimo = "0000";

            //    int codigoint = int.Parse(ultimo);
            //    codigoint++;
            //    codigostr = codigoint.ToString();

            //    if (codigoint.ToString().Length == 1)
            //    {
            //        // colocamos los ceros
            //        codigostr = "000" + codigoint.ToString();
            //    }
            //    if (codigoint.ToString().Length == 2)
            //    {
            //        // colocamos los ceros
            //        codigostr = "00" + codigoint.ToString();
            //    }
            //    if (codigoint.ToString().Length == 3)
            //    {
            //        // colocamos los ceros
            //        codigostr = "0" + codigoint.ToString();
            //    }
            //    if (codigoint.ToString().Length > 4)
            //    {
            //        throw new Exception("Termino de secuencia de correlativo ultimo =" + ultimo);
            //    }

            //}
           
            //return familia + codigostr;




            //return result;
        }
    }
}
